// 引入xlsx
import XLSX from "xlsx";

/**
 * 根据JSON数组，生成Excel文件，并下载（只生成一个工作表）
 *
 * @param Object {bookName, sheetName, columnWidth, data}
 * @returns file 直接下载excel文件
 *
 * 示例传参：
 * {
 *    bookName: `fileName`,
 *    sheetName: 'sheetName',
 *    columnWidth: [30, 50, 30],
 *    data: [{
 *      姓名: "zhangsan",
 *      年龄: 20,
 *      性别: "男"
 *    }]
 * }
 *
 */
function json2excel({ bookName, sheetName, columnWidth, data }) {
  // 新建空workbook，然后加入worksheet
  const ws = XLSX.utils.json_to_sheet(data);
  // 设置每列的列宽，10代表10个字符，注意中文占2个字符
  // 示例：ws["!cols"] = [{ wch: 10 }, { wch: 30 }, { wch: 25 }];
  ws["!cols"] = columnWidth.map(num => {
    return { wch: num };
  });
  // 新建 book
  const wb = XLSX.utils.book_new();
  // 生成xlsx文件(book, sheet数据, sheet名称)
  XLSX.utils.book_append_sheet(wb, ws, sheetName);
  // 写文件(book, xlsx文件名称)并自动触发浏览器下载
  XLSX.writeFile(wb, `${bookName}.xlsx`);
}

/**
 * 根据Excel文件生成JSON数据
 *
 * @param file excel文件
 * @param Function 回调函数，用来接收结果数据
 * @returns Array 二维数组[工作表1，工作表2，...]
 *
 */

function excel2json(file, callback) {
  // 结果数组
  let jsonArr = [];
  let reader = new FileReader();
  //按字节读取文件内容，结果为文件的二进制串
  reader.readAsBinaryString(file);
  // 读取完毕
  reader.onload = function(e) {
    let data = e.target.result;
    // 拿到workBook对象
    const wb = XLSX.read(data, {
      type: "binary"
    });
    // 遍历每张工作表进行读取
    for (const sheet in wb.Sheets) {
      // 利用 sheet_to_json 方法将 excel 转成 json 数据
      // 每一个sheet表 = wb.Sheets[sheet]
      jsonArr.push(XLSX.utils.sheet_to_json(wb.Sheets[sheet]));
    }
    // 通过回调函数的形式把结果数组传递出去
    callback(jsonArr);
  };
}

export default {
  json2excel,
  excel2json
};
